#ifndef METADATAHANDLER_H
#define METADATAHANDLER_H

#include "MetadataArchivo.h"

#include <string>
#include <iostream>

class MetadataHandler{

private:
	std::string path, pathAux;
	fstream metadata;

public:
	MetadataHandler(std::string user){
		path += USRDIR;
		path += user;
		path += USRFILES;

		pathAux += USRDIR;
		pathAux += user;
		pathAux += USRFILESAUX;
	}

	// Obtiene la metadata correspondiente a nombreArchivo.
	MetadataArchivo encontrar(std::string nombreArchivo){
		metadata.open(path.c_str());
		std::string aux;
		while(getline(metadata, aux)){
			if ( aux.substr( 0, aux.find_first_of(" ") ) == nombreArchivo ){
				metadata.close();
				return MetadataArchivo(aux);
			}
		}
		metadata.close();
		return MetadataArchivo();
	}

	// Agrega la metadata de un nuevo archivo al indice de metadata.
	void agregar(MetadataArchivo &dataArch){

		// Inicializa las variables necesarias.
		metadata.open(path.c_str(), std::ios_base::in);
		ofstream metadataAux(pathAux.c_str());
		bool escrito = false, esPrimeraLinea = true;
		std::string aux;

		// Lee linea a linea el archivo de metadata.
		while (getline(metadata, aux)){
			MetadataArchivo dataArchAux(aux);
			// Si la data a agregar es menor (comparando nombres) que la
			// ultima leida del archivo, se escribe antes.
			if ( (!escrito) && (dataArchAux.compararConNombre(dataArch) > 0) ){
				if (!esPrimeraLinea) metadataAux << "\n";
				else esPrimeraLinea = false;
				metadataAux << dataArch;
				escrito = true;
			}
			// Se escribe la data leida del archivo.
			if (!esPrimeraLinea) metadataAux << "\n";
			else esPrimeraLinea = false;
			metadataAux << dataArchAux;
		}
		// Si es mayor que todas las demas, se escribe al final.
		if(!escrito){
			if (!esPrimeraLinea) metadataAux << "\n";
			metadataAux << dataArch;
		}

		// Reemplaza la metadata por la auxiliar.
		metadata.close();
		metadataAux.close();
		remove(path.c_str());
		rename(pathAux.c_str(), path.c_str());
	}

	// Modifica la metadata de un archivo en el indice de metadata.
	void modificar(MetadataArchivo &dataArch){

		// Inicializa las variables necesarias.
		metadata.open(path.c_str(), std::ios_base::in);
		ofstream metadataAux(pathAux.c_str());
		bool esPrimeraLinea = true, escrito = false;
		std::string aux;

		// Lee linea a linea el archivo de metadata.
		while (getline(metadata, aux)){
			MetadataArchivo dataArchAux(aux);
			// Si la data a agregar es igual (comparando nombres) que la
			// ultima leida del archivo, se escribe, reemplazando a la leida.
			if  ( (!escrito) && (dataArchAux.compararConNombre(dataArch) == 0) ){
				if (!esPrimeraLinea) metadataAux << "\n";
				else esPrimeraLinea = false;
				metadataAux << dataArch;
				escrito = true;
			}else {
				// Se escribe la data leida del archivo.
				if (!esPrimeraLinea) metadataAux << "\n";
				else esPrimeraLinea = false;
				metadataAux << dataArchAux;
			}
		}

		// Reemplaza la metadata por la auxiliar.
		metadata.close();
		metadataAux.close();
		remove(path.c_str());
		rename(pathAux.c_str(), path.c_str());
	}

	std::string getFileList(){

		// Inicializa las variables necesarias.
		metadata.open(path.c_str(), std::ios_base::in);
		std::string aux, fileList;

		// Lee linea a linea el archivo de metadata.
		while (getline(metadata, aux)){
			MetadataArchivo dataArchAux(aux);
			//aux.clear();
			// Se escribe la data leida del archivo.
			fileList += " ";
			fileList += dataArchAux.getFileInfo();
		}

		std::cout << "Metadata.getFileList) fileList = " << fileList << std::endl;

		return fileList;
	}

};

#endif
